﻿using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.IO;
using ConsoleApplication1;
using System.Data.SqlClient;
using System.Data;

namespace ConsoleApplication2
{
    static class Parser
    {
        static private ArrayList Parsear(string ruta)
        {
            StreamReader objReader = new StreamReader(ruta);
            string sLine = "";
            ArrayList arrText = new ArrayList();
            while (sLine != null)
            {
                sLine = objReader.ReadLine();
                if (sLine != null)
                    arrText.Add(sLine);
            }
            objReader.Close();
            return arrText;
        }

        private static Conexion InstanciarConexion()
        {
            Conexion nueva = new Conexion();
            return (nueva);
        }

        public static Resultado ValidaArchivo(string ruta, Proyecto proyecto, Usuario lider)
        {
            ArrayList archivo = Parsear(ruta);//crea perfil y se llena con lo que este en la base de datos
            Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[BuscaPerfilProyecto]"; // dado un perfil de reglas retorna las reglas que estan asociadas
                command.CommandTimeout = 10;
                
                command.Parameters.AddWithValue("@Proyecto", proyecto.Id);

                SqlDataReader reader = command.ExecuteReader();                
                    if (reader.HasRows)
                        while (reader.Read())
                        {
                            int idregla = reader.GetInt32(0);
                            string nombreregla = reader.GetString(1);
                            string tiporegla = reader.GetString(2);
                            string descripcion = reader.GetString(3);
                            Regla regla;
                            Resultado result = new Resultado();
                            if (tiporegla == "Parentesis")
                            {                                
                                if (nombreregla == "ParentesisCEF")
                                {
                                    regla = new ReglaParentesis(1);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;                                    
                                }
                                else if (nombreregla == "ParentesisSE")
                                {
                                    regla = new ReglaParentesis(2);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "ParentesisEX")
                                {
                                    regla = new ReglaParentesis(3);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "ParentesisIN")
                                {
                                    regla = new ReglaParentesis(4);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                            }
                            else if (tiporegla == "Operadores")
                            {
                                if (nombreregla == "EspacioAntes")
                                {
                                    regla = new ReglaOperadores(1);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "EspacioDespues")
                                {

                                    regla = new ReglaOperadores(2);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                            }
                            else if (tiporegla == "NombreClase")
                            {
                                if (nombreregla == "Mayuscula_NoUnderscore")
                                {
                                    regla = new ReglaDeNombre(1);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "Mayuscula_SiUnderscore")
                                {
                                    regla = new ReglaDeNombre(2);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "Minuscula_NoUnderscore")
                                {
                                    regla = new ReglaDeNombre(3);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "Minuscula_SiUnderscore")
                                {
                                    regla = new ReglaDeNombre(4);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                            }
                            else if (tiporegla == "Llaves")
                            {
                                if (nombreregla == "regla_LlavesSolas")
                                {
                                    regla = new ReglaLLaves(1);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "regla_LlavesJuntas")
                                {
                                    regla = new ReglaLLaves(2);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "regla_LlavesCompJS")
                                {
                                    regla = new ReglaLLaves(3);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                                else if (nombreregla == "regla_LlavesCompSJ")
                                {
                                    regla = new ReglaLLaves(4);
                                    if (regla.Aplicar(archivo).Respuesta == false)
                                        return result;
                                }
                            }
                            return result;
                        }
                    else
                        Console.WriteLine("No rows returned.");              
                    reader.Close();
                    bd.CerrarConexionBd();
            }
            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }

            ReglaParentesis _reglaparentesis = new ReglaParentesis(1);
            Resultado Result = null;
            return Result;
        }
        

    }
}
